<link rel="import" href="../polymer/polymer.html">
<script src="../moment/min/moment.min.js"></script>
<script src="../moment-timezone/builds/moment-timezone-with-data.min.js"></script>

<dom-module id="chops-timestamp">
  <template>
    <style>
    </style>
    <template is="dom-if" if="[[!short]]">
      [[_formattedDate]] ([[_computeRelativeTime(_date)]])
    </template>
    <template is="dom-if" if="[[short]]" title="[[_formattedDate]]">
      [[_computeRelativeTime(_date)]]
    </template>
  </template>
  <script>
    'use strict';

    /**
     * `<chops-timestamp>` displays a formatted time string in PDT and the relative time.
     *
     * This element shows a time in a human readable form.
     *
     * @customElement
     * @polymer
     * @demo /demo/chops-timestamp_demo.html
     */
    class ChopsTimestamp extends Polymer.Element {
      static get is() { return 'chops-timestamp'; }

      static get properties() {
        return {
          /** The data for the time which can be in any format readable by
           *  Date.parse.
           */
          timestamp: String,
          /** When true, a shorter version of the date will be displayed. */
          short: {
            type: Boolean,
            value: false,
          },
          /** The format of the date. */
          dateFormat: {
            type: String,
            value: "ddd, D MMM YYYY, h:mm a z",
          },
          /** The moment object, which is stored in UTC, to be processed. */
          _date: {
            type: Object,
            value: () => (moment()),
            computed: '_computeDate(timestamp)',
          },
          /** The formatted date. */
          _formattedDate: {
            type: String,
            computed: '_computeDisplayedTime(_date, dateFormat)',
          },
        }
      }

      _computeDate(timestamp) {
        // Check if timestamp is unix time first.
        let date = Number.parseInt(timestamp);
        if (Number.isNaN(date)) {
          // Date.parse returns milliseconds since epoch but we want seconds.
          date = Date.parse(timestamp) / 1000;
          if (Number.isNaN(date)) {
            // Default to now if all else fails.
            date = (new Date()).getTime() / 1000;
          }
        }

        return moment.unix(date).tz('America/Los_Angeles');
      }

      _computeDisplayedTime(date, format) {
        return date.format(format);
      }

      _computeRelativeTime(date) {
        return date.fromNow();
      }

    }
    customElements.define(ChopsTimestamp.is, ChopsTimestamp);
  </script>
<dom-module>
